package com.base.common.utils;

import java.text.ParseException;
import java.util.Calendar;
import java.util.Date;
import java.util.GregorianCalendar;

import org.apache.commons.lang3.time.DateFormatUtils;

/**
* @ClassName: DateUtils
* @Description: 时间工具类
* @author: admin
* @since V1.0 2017年9月8日 下午1:54:56
 */
public class DateUtils extends org.apache.commons.lang3.time.DateUtils{

	private static String[] parsePatterns = {
			"yyyy-MM-dd", "yyyy-MM-dd HH:mm:ss", "yyyy-MM-dd HH:mm", "yyyy-MM", 
			"yyyy/MM/dd", "yyyy/MM/dd HH:mm:ss", "yyyy/MM/dd HH:mm", "yyyy/MM",
			"yyyy.MM.dd", "yyyy.MM.dd HH:mm:ss", "yyyy.MM.dd HH:mm", "yyyy.MM"};
	
	/**
	 * 日期格式：yyyy-MM-dd
	 */
	public static final String PATTERN_DATE = "yyyy-MM-dd";

	/**
	 * 日期格式：yyyy-MM-dd HH:mm:ss
	 */
	public static final String PATTERN_DATE_TIME = "yyyy-MM-dd HH:mm:ss";

	
	/**
	 * 得到当前日期字符串 格式（yyyy-MM-dd）
	 */
	public static String getDate() {
		return getDate("yyyy-MM-dd");
	}
	
	public static String getDateTime() {
		return getDate(null);
	}
	
	/**
	 * 得到当前日期字符串 格式（yyyy-MM-dd） pattern可以为："yyyy-MM-dd" "HH:mm:ss" "E"
	 */
	public static String getDate(String pattern) {
		if(null == pattern) {
			pattern = PATTERN_DATE_TIME;
		}
		return DateFormatUtils.format(new Date(), pattern);
	}
	
    
    //TODO /***********************类型转换******************************/
	/**
	 * Date ==> String
	 */
    public static String toStringformat(Date date, String pattern) {
        if (null == date) {
            return "";
        }
        if (pattern == null) {
			pattern = "yyyy-MM-dd HH:mm:ss";
		}
        return DateFormatUtils.format(date, pattern);
    }
    
   /**
    * String ==> Date
    * 自动配对时间格式
    */
	public static Date toDateParse(Object str) {
		if (str == null){
			return null;
		}
		try {
			return parseDate(str.toString(), parsePatterns);
		} catch (ParseException e) {
			return null;
		}
	}
    
    
    public static Long toLong(String time) {
		if (time == null) {
			return (long) 0;
		}
		Date date = DateUtils.toDateParse(time);
		return date.getTime() / 1000;
	}
    
    //TODO /**********改动时间的 天 、 时 、 分************/
	
    /**
     * 时间改动n 天
     * @param date
     * @param day 天数，负数就是n天前
     */
    public static Date dayAfter(Date date, int n) {
		Calendar calendar = new GregorianCalendar();
		calendar.setTime(date);
		calendar.add(Calendar.DATE, n);//把日期往后增加n天.整数往后推,负数往前移动
    	return calendar.getTime();
    }
    
    /**
     * 当前时间改动 n 小时
     */
    public static Date hoursAfter(int n) {
		Calendar calendar = new GregorianCalendar();
		calendar.setTime(new Date());
		calendar.add(Calendar.HOUR, n);//把日期往后增加n天.整数往后推,负数往前移动
    	return calendar.getTime();
    }
    
    /**
     * 时间改动 n 分钟
     */
    public static Date minAfter(int n) {
		Calendar calendar = new GregorianCalendar();
		calendar.setTime(new Date());
		calendar.add(Calendar.MINUTE, n);//把日期往后增加n天.整数往后推,负数往前移动
    	return calendar.getTime();
    }
    
    /**
     * 获取今天开始时间。
     */
    public static Date getTodayBegin() {
        return getDateBegin(new Date());
    }
    
    /**
     * 获取今天结束时间。
     */
    public static Date getTodayEnd() {
        return getDateEnd(new Date());
    }
    
	/**
     * 获取某天的开始时间。
     */
    public static Date getDateBegin(Date date) {
        if (date == null) {
            return null;
        }
        return truncate(date, Calendar.DATE);
    }
    /**
     * 获取某天的结束时间。
     */
    public static Date getDateEnd(Date date) {
        if (date == null) {
            return null;
        }
        Calendar cal = Calendar.getInstance();
        cal.setTime(date);
        cal.set(Calendar.HOUR_OF_DAY, 23);
        cal.set(Calendar.MINUTE, 59);
        cal.set(Calendar.SECOND, 59);
        cal.set(Calendar.MILLISECOND, 0);
        return cal.getTime();
    }
    
/**************** 周工具方法 ******************/
    
    /**
     * 根据日期对象获取星期几，根据中国人的传统将星期一作为星期的第一天。
     * <p><strong>返回值说明：</strong>
     * <ul>
     * <li>当 date 为 null 时，返回 0</li>
     * <li>其他情况返回 1-7 的数字</li>
     * <li>其中，星期一是 1，星期天是 7</li>
     * </ul>
     */
    public static int getChineseWeek(Date date) {
        if (date == null) {
            return 0;
        }

        Calendar cal = Calendar.getInstance();
        cal.setTime(date);
        int dayOfWeek = cal.get(Calendar.DAY_OF_WEEK);
        return dayOfWeek == 1 ? 7 : dayOfWeek - 1;
    }

	public static void main(String[] args) {
		
	}
}
